package com.liiiyian.testitem.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.liiiyian.testitem.domain.Result;
import com.liiiyian.testitem.domain.Table1;
import com.liiiyian.testitem.listener.EasyExcelListener;
import com.liiiyian.testitem.service.Table1Service;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

/**
 * @author LiiiYiAn
 * @version 1.0
 * @createDate 2024-06-04 14:17
 * @projectName testItem
 * @className testController
 * @description 练习考核操作控制器
 */
@RestController
@RequestMapping("/test")
@RequiredArgsConstructor  // 构造器注入
@Slf4j
@CrossOrigin(origins = "*")  // 该类所有接口都可以跨域
public class testController {

    private final Table1Service table1Service;

    /**
     * @author LiiiYiAn
     * @createDate 2024/6/4 14:35
     * @description 添加用户
     * @param table1 用户信息对象
     * @return com.liiiyian.testitem.domain.Result 统一响应结果
     **/
    @PostMapping("/add")
    public Result addUser(Table1 table1) {
        return table1Service.addUser(table1) > 0 ? Result.success() : Result.error("新增失败");
    }


    /**
     * @author LiiiYiAn
     * @createDate 2024/6/4 18:55
     * @description 根据column1字段删除指定用户信息
     * @param column1
     * @return com.liiiyian.testitem.domain.Result
     **/
    @PostMapping("/delete")
    public Result deleteUser(String column1) {
        return table1Service.deleteUserByColumn1(column1) > 0 ? Result.success() : Result.error("删除失败");
    }


    /**
     * @author LiiiYiAn
     * @createDate 2024/6/4 19:00
     * @description 根据column1字段修改指定用户信息
     * @param table1
     * @return com.liiiyian.testitem.domain.Result
     **/
    @PostMapping("/update")
    public Result updateUser(Table1 table1) {
        return table1Service.updateUserByColumn1(table1) > 0 ? Result.success() : Result.error("修改失败");
    }


    /**
     * @author LiiiYiAn
     * @createDate 2024/6/4 14:35
     * @description 查询分页用户信息
     * @return com.liiiyian.testitem.domain.Result
     **/
    @GetMapping("/selectPage")
    public String selectUserPage(Integer page, Integer rows) {
        // EasyUI表格中添加了分页插件后，会自动在请求url中附带分页参数page（当前页数）和rows（每页显示数）
        // 进行分页查询并将查询结果的分页对象存储
        Page<Table1> pageTable1 = table1Service.findUsersPage(page, rows);

        // 存储分页查询数据、分页配置信息
        Map<String, Object> map = new HashMap<>();
        map.put("rows", pageTable1.getRecords());  // 分页查询数据
        map.put("total", pageTable1.getTotal());  // 总记录数total
        map.put("pageSize", pageTable1.getSize());  // 每页显示数
        map.put("pages", pageTable1.getPages());  // 总页数


        // 使用统一响应结果封装类时，不知道EasyUI只能获取JSON格式的响应结果
        // 怎么通过EasyUI进行前后端数据交互，这个问题困扰了我几个小时
        // return Result.success(table1All);
        // 返回一个封装了分页对象信息Map的JSON格式
        return JSON.toJSONString(map);
    }



    /**
     * @author LiiiYiAn
     * @createDate 2024/6/5 14:10
     * @description 条件查询：按照字段名和查询关键字（分页查询）
     * @param column 字段名
     * @param key 查询关键字
     * @return java.lang.String
     **/
    @GetMapping("/selectUserByColumnAndKey")
    public String selectUserByColumnAndKey(String column, String key, Integer page, Integer rows) {
        // 进行分页查询并将查询结果的分页对象存储
        Page<Table1> pageTable1Condition = table1Service.findUserByColumnAndKey(column, key, page, rows);

        // 存储分页查询数据、分页配置信息
        Map<String, Object> map = new HashMap<>();
        map.put("rows", pageTable1Condition.getRecords());  // 分页查询数据
        map.put("total", pageTable1Condition.getTotal());  // 总记录数total
        map.put("pageSize", pageTable1Condition.getSize());  // 每页显示数
        map.put("pages", pageTable1Condition.getPages());  // 总页数

        // 返回一个封装了分页对象信息Map的JSON格式
        return JSON.toJSONString(map);
    }


    /**
     * @author LiiiYiAn
     * @createDate 2024/6/6 9:18
     * @description 将数据库所有数据导出为Excel文件
     * @param response 响应对象
     * @return java.lang.String
     **/
    @RequestMapping("/export")  // 注意！不要指定接口类型，使用@RequestMapping
    public void excelExport(HttpServletResponse response) throws IOException {
        // 使用swagger 会导致各种问题，请直接用浏览器或者用postman
        // 设置下载类型为Excel文件
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        // 设置文件编码格式
        response.setCharacterEncoding("utf-8");

        // 设置文件名：URLEncoder.encode可以防止中文乱码 当然和EasyExcel没有关系
        String fileName = URLEncoder.encode("人员信息表 - 所有信息", "UTF-8").replaceAll("\\+", "%20");
        // 设置文件头
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

        // 读数据并写入文件
        EasyExcel.write(response.getOutputStream(), Table1.class).sheet("模板").doWrite(table1Service.findUsersAll());
    }


    /**
     * @author LiiiYiAn
     * @createDate 2024/6/5 17:29
     * @description 读取客户端上传的Excel文件，并将数据导入数据库
     * @param file 文件对象
     * @return com.liiiyian.testitem.domain.Result
     **/
    @PostMapping("/upload")
    public Result excelUpload(MultipartFile file) throws IOException {
        // 使用EasyExcel读上传的Excel文件并将其导入数据库
        ExcelReader reader = EasyExcel.read(file.getInputStream(), Table1.class, new EasyExcelListener(table1Service)).build();
        ReadSheet sheet = EasyExcel.readSheet().build();
        reader.read(sheet);

        return Result.success();
    }

}
